//引入vue
import Vue from 'vue'

//管理购物车数据
const state = {
	//删除这里的假数据，观察真数据
	cartList: []
}
const mutations = {
	addGoodsToCartList(state, goods) {
		// console.log("==========>>>调用了这个添加商品到购物车的方法",goods);
		//判断要添加的商品是否存在
		let goodsObj = state.cartList.find(item => item.id === goods.id)
		if (goodsObj) {
			//如果商品已经存在，就对这个商品的count属性 +1 
			goodsObj.count += 1
		} else {
			//如果商品不存在，就采用响应式的方式将这个商品加入到vuex中， 必须注意，这里set的是传入进来的参数goods而不是goodsObj
			//这里注意，出于性能考虑，只有当商品被加入到购物车的时候，才添加 count 和 isSelected这两个属性，
			Vue.set(goods, 'count', 1)
			Vue.set(goods, 'isSelected', true)
			state.cartList.push(goods)
		}
		console.log("此时的商品===>>", goodsObj);
	},
	//改变商品数量的方法， vuex里面的方法只能接受两个参数，第一个必定是vuex里面的，如果参数太多，就传入对象
	changeGoodsCountMutations(state, {
		opt,
		index
	}) {
		//判断操作意图
		if (opt) {
			//增加数量的话，就直接操作
			state.cartList[index].count++
		} else {
			//传入的操作意图是减少的话，需要判断一下
			if (state.cartList[index].count > 1) {
				//如果购物车里面的商品大于1就直接减
				state.cartList[index].count--
			} else {
				//如果等于1，那么就询问用户是否要删除，
				uni.showModal({
					content: "是否删除该商品",
					success(rs) {
						// console.log(rs);
						if (rs.confirm) {
							//如果这里 rs.cancel 为true表明用户点击了确认删除
							state.cartList.splice(index, 1)
						}
					}
				})
			}
		}
	},
	//修改是否选中的状态
	changeGoodsIsSelectedMutations(state, {
		isSelected,
		index
	}) {
		state.cartList[index].isSelected = isSelected
	},
	//修改全选全不选的状态
	changeSelectedStatusMutations(state, status) {
		//直接将状态赋值给所有的商品
		state.cartList.forEach(item => item.isSelected = status)
	}
}

const actions = {

}

const getters = {
	//映射全选全不选的状态
	getSelectedStatus(state) {
		//every的判断是全部符合才返回true   some的用法是只要有符合的就返回true
		return state.cartList.every(item => item.isSelected)
	},
	//映射商品总数量
	getSelectedGoodsCount(state) {
		//使用reduce对购物车里面被选中的商品数量进行累加，reduce的第二个参数必须是0
		return state.cartList.reduce((pre, goodsItem) => {
			//这个写法虽然易懂，但是太冗余
			// return goodsItem.isSelected ? pre += goodsItem.count:pre +=0;
			return pre += goodsItem.isSelected ? goodsItem.count : 0
		}, 0)
	},
	//映射商品总价格
	getSelectedGoodsPrice(state) {
		return state.cartList.reduce((pre, goodsItem) => {
			//这个写法虽然易懂，但是太冗余
			// return goodsItem.isSelected ? pre += goodsItem.retailPrice*goodsItem.count:pre +=0;
			return pre += goodsItem.isSelected ? goodsItem.retailPrice * goodsItem.count : 0
		}, 0)
	}
}


//对外暴露模块
export default {
	state,
	mutations,
	actions,
	getters
}
